#ifndef _SEQLIST_H_
#define _SEQLIST_H_

#include <stddef.h>

// 函数指针类型定义
typedef int (*seqlist_cmp_t)(const void *data, const void *key); // 比较函数
typedef void (*seqlist_traval_t)(const void *data);              // 遍历函数

typedef struct seqlist {
  void *arr;    // 存储数据的连续内存
  int nmemb;    // 当前元素个数
  size_t size;  // 单个元素的大小
  int capacity; // 最大容量
} seqlist_t;

// 初始化顺序表
int seqlist_init(seqlist_t **mylist, size_t elem_size, int init_capacity);

// 判断顺序表是否满
int seqlist_full(const seqlist_t *mylist);

// 判断顺序表是否空
int seqlist_empty(const seqlist_t *mylist);

// 在表尾插入元素
int seqlist_push_back(seqlist_t *mylist, const void *newdata);

// 在指定位置插入元素
int seqlist_insert(seqlist_t *mylist, int index, const void *newdata);

// 按 key 删除第一个匹配的元素
int seqlist_delete(seqlist_t *mylist, const void *key, seqlist_cmp_t cmp);

// 按 key 更新第一个匹配的元素
int seqlist_update(seqlist_t *mylist, const void *key, const void *newdata,
                   seqlist_cmp_t cmp);

// 按 key 查找第一个匹配的元素
void *seqlist_forsearch(const seqlist_t *mylist, const void *key,
                        seqlist_cmp_t cmp);

// 遍历所有元素
void seqlist_traval(const seqlist_t *mylist, seqlist_traval_t traval);

// 销毁顺序表
void seqlist_destory(seqlist_t **mylist);

// 获取当前元素个数
int seqlist_size(const seqlist_t *mylist);

// 获取容量
int seqlist_capacity(const seqlist_t *mylist);

// 获取 index 位置的元素
const void *seqlist_get(const seqlist_t *mylist, int index);

// 修改 index 位置的元素
int seqlist_set(seqlist_t *mylist, int index, const void *newdata);

// 清空所有元素
void seqlist_clear(seqlist_t *mylist);

// 调整容量
int seqlist_resize(seqlist_t **mylist, int new_capacity);

// 内部函数，交换两个地址的内容
static void __swap(void *a, void *b, size_t size);

// 快速排序
int seqlist_qsort(void *base, size_t nmemb, size_t size, seqlist_cmp_t cmp);

// 二分查找
void *seqlist_bsearch(void *key, seqlist_t *mylist, seqlist_cmp_t cmp);

// 反转数据
int seqlist_reverse(seqlist_t *mylist);

int seqlist_init_by_list(seqlist_t **newlist, const seqlist_t srclist);

int seqlist_new_reverse(seqlist_t **newlist, const seqlist_t srclist);
#endif // _SEQLIST_H_
